// 本文件是一个head_only库

#pragma once

#include <string>
#include <vector>

#include <string.h>
#include <errno.h>

#include <dirent.h>     
#include <sys/types.h>

using std::string;
using std::vector;

class DirectoryScanner
{
public:
    /**
     * 静态方法：
     * 遍历目录 dir, 获取目录里面的所有文件名
     */ 
    static vector<string> scan(const string& dir);

private:
    DirectoryScanner() = delete;  // 禁止实例化
};

inline
vector<string> DirectoryScanner::scan(const string& dir) {
    DIR* dirP = opendir(dir.c_str());
    if (dirP == NULL) {
        throw string{strerror(errno)};
    }   

    vector<string> fileNames;  // 记录打开目录下的文件名
    struct dirent * dirItem;
    while (dirItem = readdir(dirP)) {
        if (dirItem->d_type != DT_REG) {  // 目录项不是普通文件，跳过
            continue;
        }
        fileNames.emplace_back(dirItem->d_name);
    }
    closedir(dirP);

    return fileNames;
}

